//
//  HomeTableViewController.swift
//  SinaWeibo
//
//  Created by apple on 15/11/8.
//  Copyright © 2015年 apple. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

private let HomeCellId = "HomeCellId"

class HomeTableViewController: BaseViewController {

    private lazy var statuses = [StatusModel]() //定义一个statuses 的属性 创建一个初始化的数组
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if !userLogin {
            visitorViews?.setUIInfo(nil , titie: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        prepareTableView() //注册tableview
        
        loadData()
        
//        
//          if ViewModel().Login  { //判断当前用户有没有登录 如果登录了 就需要注册tabbleview  如果没有登录就不注册这个方法
//        
//           
//            }
 
        
        
        
      }
    
    
    private func prepareTableView() {
        
        //在注册tableview的时候 设置下拉刷新
        refreshControl = UIRefreshControl()
        
        //添加监听方法
        refreshControl?.addTarget(self, action: "loadData", forControlEvents:.ValueChanged)
    
        tableView.registerClass(StatusCell.self, forCellReuseIdentifier: HomeCellId) //注册tableview  这是是用了自定义tableview
       // tableView.rowHeight = 200 //设置tableview 的高度 设置他的高度为100
        //预估行高 需要给tableview一个预估的行高
        tableView.estimatedRowHeight = 200
        //要使用自动计算行高 必须有以个自上而下得约束
        tableView.rowHeight = UITableViewAutomaticDimension
        
        //设置分割线 在这里是不需要分割线的
        tableView.separatorStyle = .None
        
        //设置底部的上拉加载更多的小菊花
        tableView.tableFooterView = indicatorView
    }
    
    //不要忘了在这里添加objc 的方法 因为有一个对象在调用他
  @objc  private func loadData() { //定义一个statusmodel 的数组 执行回调
    
    //因为在这里有两个id  需要取到的时第一个id 的值
    var since_id = 0
    //下拉加载更多的时候用到的
     var max_id = 0
    //在这里一般上拉加载更多 和下拉刷新智能执行一个 不能同时执行上拉 和下拉两个操作
    if indicatorView.isAnimating() {
        //如果小菊花在转到的时候 就是上拉加载更多数据
        since_id = 0
        max_id = statuses.last?.id ?? 0
    } else {
        //下拉刷新
        max_id = 0
        since_id = statuses.first?.id ?? 0
    }
    
    
    
    
     //通过id 来加载刷新数据
    StatusViewModel.loadData(since_id: since_id, max_id : max_id) { (arr) -> () in
        print(arr?.count)
        //  当加载完成数据之后 就结束 刷新
        self.refreshControl?.endRefreshing()
        
        if arr == nil {
            //网络请求失败的时候的回调
            SVProgressHUD.showErrorWithStatus(AppErrorTip)
            //加载数据失败 停止动画
            self.indicatorView.stopAnimating()
            return
        }
        
        //一定能够拿到数据  赋值
        //在这里一定要判断一下since_id 是否是大于0  大于0  说明当前是没有有新的数据 就把新数据拼接到前面  如果相等的话 就说明没有新数据 就把原来的的数据给赋值回去 
        if since_id > 0 {
          //下拉刷新拼接的字符串是放在数据函数的前面的
           self.statuses = arr! + self.statuses
            
        } else if  max_id > 0 {
            //上拉加载更多拼接字符串的函数是放在数据的后面加载的
            self.statuses = self.statuses + arr!
            //当上拉加载更多的时候 就需要停止动画
            self.indicatorView.stopAnimating()
            
        }  else {
            //首次加载
            self.statuses = arr! //给属性赋值 就这样获得数据
        }
        
        self.tableView.reloadData()
    }
    
//       StatusViewModel.loadData { (arr) -> () in
//        
//       print(arr?.count)
//        //  当加载完成数据之后 就结束 刷新
//        self.refreshControl?.endRefreshing()
//        
//        if arr == nil {
//            SVProgressHUD.showErrorWithStatus(AppErrorTip)
//            return
//        }
//          //一定能够拿到数据  赋值
//         self.statuses = arr! //给属性赋值 就这样获得数据
//        
//         self.tableView.reloadData()
//    
//    }
    
    
//        
//        
//        
//        let AFN = AFHTTPSessionManager()
//        
//        let uslSting = "https://api.weibo.com/2/statuses/home_timeline.json"
//        
//        guard let token = ViewModel().token else { //守卫 这个方法是需要确定token是一定有值 把token从一个可选类型变成一个确定存在的类型 如果token是没有值的话说明当前用户是没有登录的
//        
//          SVProgressHUD.showErrorWithStatus("你暂未登录")
//            return
//        }
//    
//        let parameters = ["access_token" : token]
//        
//        AFN.GET(uslSting, parameters: parameters, success: { (_, result) -> Void in
//            
//            guard let dict = result as? [String : AnyObject] else { //守卫 保证数据result 一定是有值的
//              
//                finished(arr: nil)
//                return
//            }
//            if let arrM = dict["statuses"] as? [[String : AnyObject]] { //字典转模型 把数组中得值给arrm 模型  把字典中模型取出来赋值给数组 [[]] 相当于一个字典外面包了一层数组 这个就相当于把字典定义成数组的形式  statuse是数据中得一个字段 保存的时字典 需要数据取出来
//                
//            var list = [StatusModel]() //初始化的数组
//                
//                for item in arrM {
//                
//                let s = StatusModel(dict: item) //字典转模型
//                    
//                    list.append(s)
//                }
//                
//                finished(arr: list) //执行回调 给数组中添加数据
//            }
//            
//            }) { (_, error) -> Void in
//                
//                finished(arr: nil)
//                print(error)
//        }
  }
    
    
    //初始化一个小菊花 颜色为灰色的
    private lazy var indicatorView : UIActivityIndicatorView = {
    
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
        
        return indicator
    }()
    
}

extension HomeTableViewController {
  override  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return statuses.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(HomeCellId, forIndexPath: indexPath) as! StatusCell
        
       // cell.textLabel?.text = statuses[indexPath.row].user?.name
        cell.status = statuses[indexPath.row]
        //判断当前为倒数第一行数据  并且小菊花没有在转到的时候 加载更多数据
        if indexPath.row == statuses.count - 1 && !indicatorView.isAnimating()  {
            //开始动画 动画完成之后加载更多数据
            indicatorView.startAnimating()
            print("开始静默加载数据")
            loadData()
        }
        
        return cell
}

}


